/***********************************************************************************
 * 文件名： boost_controller.h
 * 作者： 刘言
 * 版本： 8
 * 说明：
 *      升压控制器（静态、单例），升压电路的驱动，通过电压值反馈调整PWM占空比达到升压，并
 * 恒定电压的目的。
 *      提供以下功能：
 *          升压输出；
 *          电压调节；
 *          过流保护和通知；
 *          过载通知；
 *          开路保护和通知【未实现】。
 * 修改记录：
 * 	2020/11/04: 初版。 刘言。
 *  2021/07/07: V2。支持通过 _BSTC_FULL_ADV 来决定AD值变量类型，尽量降低RAM占用。
 *          增加 _BSTC_USE_ADV_FILTER 开关。
 *          增加 BSTC_EV_OVER_LOAD 事件。
 *          支持 POLSYS_LITE。
 *  2021/07/11: V3.增加配置项“判断过载时允许的向下偏差电压”。
 *  2021/07/12：V4.增加 BSTC_EV_NO_BOOST 事件，现在支持同时发送多个事件，每个事件占据一个位，
 *          见 boostc_event_t ，注意更改判断事件的逻辑。
 *  2021/07/14: V5. BSTC_EV_OVER_LOAD BSTC_EV_NO_BOOST 事件现在可裁剪去掉。
 *  2022/06/22: V6. 引入PID算法加强电压稳定性。仅保留中断中的快速电压调整。启动时输入初始PWM。
 *  2022/07/18: V7. 获取实际电压更准确（9次中值滤波）。
 *  2022/07/21: 始终启用PID；去掉启动函数的电压参数；调整API名称；去掉多余需要设置的API。
***********************************************************************************/
#ifndef _BOOST_CONTROLLER_H_
#define _BOOST_CONTROLLER_H_

#ifdef __cplusplus
 extern "C" {
#endif 

#include "boostc_config.h"
#include "polsys.h"

// 自定义类型

typedef enum _boostc_event_t
{
    BSTC_EV_NULL = 0,               
    BSTC_EV_OVER_TEMP = (1<<0),          // 温度过高【未实现】
    BSTC_EV_OVER_LOAD = (1<<1),          // 过载，输出电压过低
    BSTC_EV_SHORT_OUT = (1<<2),          // 短路、过流了，已经停止输出
    BSTC_EV_NO_BOOST = (1<<3),           // 未升压，目标电压过低，无需升压就能达到或者超过
    BSTC_EV_STARTED = (1<<4),            // 已（成功）启动，注意本事件在中断中调用，注意处理代码耗时
    BSTC_EV_END
}boostc_event_t;

#if (_BSTC_FULL_ADV > 256)
typedef u16 bstc_adv_t;
#else
typedef u8 bstc_adv_t;
#endif

#if (_BSTC_FULL_PWM_VALUE > 255)
typedef u16 bstc_pwmv_t;
#else
typedef u8 bstc_pwmv_t;
#endif


// 仅仅是为了使用伪函数优化而曝光以下属性

extern bit _BSTC_mRun;
extern bstc_pwmv_t _BSTC_mMaxPwmValue;


// APIs

#ifdef POLSYS_LITE
// 必须定时间隔调用，建议间隔10ms调用一次
void BSTC_Loop();
#endif

// 由外部调用（一般是ADC中断）来通知 BSTC 采集到了新的输出电压反馈脚的AD值。
// 建议AD采集间隔40~100us，在采集完成中断中调用。
// adv: 最新采集到的AD值
void BSTC_EvNewFBV(bstc_adv_t adv);

// MOS管电流过大事件，由外部调用，通知 BSTC。
// 一般是由电压比较器或者ADC产生中断在中断中调用，可以不调用。
void BSTC_EvOverCurrent();

// 初始化
// 会依次掉用 _BSTC_InitPwm() _BSTC_InitAdc()
void BSTC_Init();

// 开始升压，注意确保已经设置了合适的 Target 。
// start_pwm: 启动时的PWM值
void BSTC_Start(bstc_pwmv_t start_pwm);

// 停止升压，开关立即截止
void BSTC_Stop();   

// 设置目标电压(mV)
void BSTC_SetTarget(u16 voltage);

#ifdef _BSTC_USE_GET_REAL_VOLTAGE
// 获取当前实际输出电压，启动1ms之后才能获取准确的值，单位mV
u16 BSTC_GetNowVoltage();
#endif

// 获取是否正在运行
#define BSTC_IsRun()    _BSTC_mRun

// 设置最大PWM值
// value: 要设置的值
#define BSTC_SetMaxPwmValue(bstc_pwmv_t_value)   _BSTC_mMaxPwmValue = bstc_pwmv_t_value;


#ifdef __cplusplus
}
#endif 

#endif



